#include "mytcpsocket.h"
#include <QDebug>
#include <dboperator.h>

MyTcpSocket::MyTcpSocket()
{
    connect(this,SIGNAL(readyRead()),this,SLOT(receiveMsg()));
}

void MyTcpSocket::receiveMsg()
{
    qDebug()<<"收到数据"<<this->bytesAvailable();
    uint uiPDULen=0;
    //从收到的信息中读取开头uint长度的数据（即为总的消息大小），赋值给uiPDULen
    this->read((char*)&uiPDULen,sizeof(uint));
    //计算得到实际消息大小，sizeof(PDU)只会计算结构体大小，而不是分配的大小
    uint uiMsgLen = uiPDULen - sizeof(PDU);
    PDU *pdu = mkPDU(uiMsgLen);
    // 接收剩余部分数据（第一个uint已读取）
    this -> read((char*)pdu + sizeof(uint), uiPDULen - sizeof(uint));
    // 输出
    qDebug() << pdu -> uiMsgType << ' ' << (char*)pdu -> iMsg;
    // 根据不同消息类型，执行不同操作
    PDU* resPdu = NULL; // 响应报文
    switch(pdu -> uiMsgType){
    case ENUM_MSG_TYPE_REGISTER_REQUEST: // 注册请求
        {
        resPdu = handleRegisterRequest(pdu); // 请求处理
        break;
        }
    default:
        break;
    }

    // 响应客户端
    if(NULL != resPdu)
    {
        qDebug() << resPdu -> uiMsgType << " " << resPdu ->iMsg;
        this -> write((char*)resPdu, resPdu -> uiPDULen);
        // 释放空间
        free(resPdu);
        resPdu = NULL;
    }
    // 释放空间
    free(pdu);
    pdu = NULL;
}

// 处理注册请求并返回响应PDU
PDU* MyTcpSocket::handleRegisterRequest(PDU* pdu)
{
    char caName[32] = {'\0'};
    char caPwd[32] = {'\0'};
    // 拷贝读取的信息
    strncpy(caName, pdu -> caFileData, 32);
    strncpy(caPwd, pdu -> caFileData + 32, 32);
    qDebug() << pdu -> uiMsgType << " " << caName << " " << caPwd;
    bool ret = DBOperator::getInstance().handleRegister(caName, caPwd); // 处理请求，插入数据库

    // 响应客户端
    PDU *resPdu = mkPDU(0); // 响应消息
    resPdu -> uiMsgType = ENUM_MSG_TYPE_REGISTER_RESPOND;
    if(ret)
    {
        strcpy(resPdu -> caFileData, REGIST_OK);
    }
    else
    {
        strcpy(resPdu -> caFileData, REGIST_FAILED);
    }
    // qDebug() << resPdu -> uiMsgType << " " << resPdu ->caData;

    return resPdu;
}
